Pomale zpracovani SELECTU v IB
Otázka od: Jaroslav Kohák
19. 12. 2002 11:47
Ahoj lidi,
bojuju s nasledujicim problemem rychlosti. V asi 200MB DB mam jednu tabulku (A)
ktera slouzi jako master pro druhou - detail(B). Tzn v tabulce A si uzivatel
vybere zaznam a v Becku vidi dalsi detaily. Svazuje je parametr :S21DAVKA_UKID.
Nasledujici select je prave ta tabulka B.
SELECT b.S21DAVKA_UKID, a.S21KOMPID, SUM(a.MNOZSTVI)
FROM S21DAVKAREC a
LEFT JOIN S21DAVKA_UKD b ON (a.S21DAVKAID = b.S21DAVKAID)
WHERE S21DAVKA_UKID = :S21DAVKA_UKID
GROUP BY b.S21DAVKA_UKID, a.S21KOMPID
Problem je v tom, ze pri kazdem posunu mezi radky v tab A probehne zpracovani
tohoto selectu a ono to trva skoro 45!!! sec (na PIII 850 s 256MB RAM a W2K).
Po tu dobu disk skoro nejede, zato sluzba IBServ jede na 100%.
Neda se tomu nejak pomoct, nebo predelat ten select? Zkousel jsem z toho udelat
proceduru v IB a jen ji spoustet, ale to bylo totez.
Diky Tymi
Odpovedá: Roman
19. 12. 2002 11:26
>Ahoj lidi,
>bojuju s nasledujicim problemem rychlosti. V asi 200MB DB mam jednu tabulku
(A) ktera >slouzi jako master pro druhou - detail(B). Tzn v tabulce A si
uzivatel vybere zaznam a v Becku >vidi dalsi detaily. Svazuje je parametr
:S21DAVKA_UKID. Nasledujici select je prave ta >tabulka B.
>SELECT b.S21DAVKA_UKID, a.S21KOMPID, SUM(a.MNOZSTVI)
>FROM S21DAVKAREC a
>LEFT JOIN S21DAVKA_UKD b ON (a.S21DAVKAID = b.S21DAVKAID)
>WHERE S21DAVKA_UKID = :S21DAVKA_UKID
>GROUP BY b.S21DAVKA_UKID, a.S21KOMPID
Nahore pises, ze ty tabulky svazuje S21DAVKA_UKID, v tom selectu je JOIN ON
S21DAVKAID? Jsou na tech polich indexy? Mno, a nemuzes pouzit INNER JOIN?
Roman
==============================
http://kouzelne.misto.cz
Odpovedá: Ing. Pavel Žilinec
19. 12. 2002 11:11
Nevim, jak na IB, ale snad je to podobne s MS SQL:
Pro rychly vyber vetsinou plati, ze spojovane sloupce maji indexy a
pokud mozno jde o ciselny kod (treba v pripade Hlavicka <- Detail),
pze u textovych hodnot bude spojeni pomalejsi.
Indexy se automaticky pridaji, pokud je sloupec definovan jako Unique
nebo jako primarni klic nebo je obsazen v referencni integrite.
Pokud ani jedno neexistuje, dohod si tam index na ten sloupec rucne.
Snad Ti to nejak pomuze (podle mne by melo)
--------
ing. Pavel Zilinec
MailTo:zilinec@email.cz
Prog-Soft s.r.o. Plzen
Informacni system pro vyrobce
a distributory napoju
JK> Ahoj lidi,
JK> bojuju s nasledujicim problemem rychlosti. V asi 200MB DB mam jednu tabulku
(A) ktera slouzi jako master pro druhou - detail(B). Tzn v tabulce A si
uzivatel vybere zaznam a v Becku vidi dalsi
JK> detaily. Svazuje je parametr :S21DAVKA_UKID. Nasledujici select je prave ta
tabulka B.
JK> SELECT b.S21DAVKA_UKID, a.S21KOMPID, SUM(a.MNOZSTVI)
JK> FROM S21DAVKAREC a
JK> LEFT JOIN S21DAVKA_UKD b ON (a.S21DAVKAID = b.S21DAVKAID)
JK> WHERE S21DAVKA_UKID = :S21DAVKA_UKID
JK> GROUP BY b.S21DAVKA_UKID, a.S21KOMPID
JK> Problem je v tom, ze pri kazdem posunu mezi radky v tab A probehne
zpracovani tohoto selectu a ono to trva skoro 45!!! sec (na PIII 850 s 256MB
RAM a W2K). Po tu dobu disk skoro nejede, zato
JK> sluzba IBServ jede na 100%.
JK> Neda se tomu nejak pomoct, nebo predelat ten select? Zkousel jsem z toho
udelat proceduru v IB a jen ji spoustet, ale to bylo totez.
JK> Diky Tymi
Odpovedá: Pavel Cisar
19. 12. 2002 15:34
Haj hou!
On 19 Dec 2002 at 10:22, Jaroslav Kohák wrote:
> Ahoj lidi,
> bojuju s nasledujicim problemem rychlosti. V asi 200MB DB mam jednu tabulku
(A) ktera slouzi jako master pro druhou - detail(B). Tzn v tabulce A si
uzivatel vybere zaznam a v Becku vidi dalsi detaily. Svazuje je parametr
:S21DAVKA_UKID. Nasledujici select je prave ta tabulka B.
>
> SELECT b.S21DAVKA_UKID, a.S21KOMPID, SUM(a.MNOZSTVI)
> FROM S21DAVKAREC a
> LEFT JOIN S21DAVKA_UKD b ON (a.S21DAVKAID = b.S21DAVKAID)
> WHERE S21DAVKA_UKID = :S21DAVKA_UKID
> GROUP BY b.S21DAVKA_UKID, a.S21KOMPID
>
> Problem je v tom, ze pri kazdem posunu mezi radky v tab A probehne zpracovani
tohoto selectu a ono to trva skoro 45!!! sec (na PIII 850 s 256MB RAM a W2K).
Po tu dobu disk skoro nejede, zato sluzba IBServ jede na 100%.
> Neda se tomu nejak pomoct, nebo predelat ten select? Zkousel jsem z toho
udelat proceduru v IB a jen ji spoustet, ale to bylo totez.
Pomohlo by, kdyby jsi nam sem poslal PLAN pouzity pro dany dotaz.
S pozdravem
Pavel Cisar
Mobil: 724 281429
http://www.ibphoenix.cz
Vse co potrebujete pro Firebird a InterBase
Odpovedá: Lstiburek Pavel
19. 12. 2002 17:09
> From: Ing. Pavel Žilinec [mailto:zilinec@email.cz]
> Nevim, jak na IB, ale snad je to podobne s MS SQL:
> Pro rychly vyber vetsinou plati, ze spojovane sloupce maji indexy a
> pokud mozno jde o ciselny kod (treba v pripade Hlavicka <- Detail),
> pze u textovych hodnot bude spojeni pomalejsi.
> Indexy se automaticky pridaji, pokud je sloupec definovan
> jako Unique
> nebo jako primarni klic nebo je obsazen v referencni integrite.
Pri optimalizaci slozitych selectu (MSSQL) jsem nahodne zjistil,
ze doplneni indexu pres primarni klic vede nekdy vyraznemu zrychleni
dotazu. Vysvetleni nemam, ale obcas to pouzivam.
Pavel